<?php

namespace app\admin\model;

use jueqi\Random;
use think\facade\Config;
use think\facade\Db;

/**
 * Admin模型
 * @controllerUrl 'authAdmin'
 * @property int $id // ID
 * @property string $username // 用户名
 * @property string $nickname // 昵称
 * @property string $avatar // 头像
 * @property string $email // 邮箱
 * @property string $mobile // 手机
 * @property int $login_failure // 登录失败次数
 * @property int $last_login_time // 登录时间
 * @property string $last_login_ip // 登录IP
 * @property string $password // 密码
 * @property string $salt // 密码盐
 * @property string $motto // 签名
 * @property mixed $status // 状态(0、禁用1、启用)
 * @property int $create_time // 创建时间
 * @property string $create_by // 创建人
 * @property int $update_time // 更新时间
 * @property string $update_by // 更新人
 * @property int $delete_time // 删除时间
 * @property string $delete_by // 删除人
 */
class Admin extends BaseModel
{
    /**
     * @var int 自动写入时间戳
     */
    protected $autoWriteTimestamp = 'int';

    /**
     * @var int 自动写入创建时间
     */
    protected $createTime = 'create_time';
    /**
     * @var int 自动写入更新时间
     */
    protected $updateTime = 'update_time';
    /**
     * 追加属性
     */
    protected $append = [
        'group_arr',
        'group_name_arr',
    ];

    /**
     * 分组ID获取器
     * @param $value
     * @param $row
     * @return array
     */
    public function getGroupArrAttr($value, $row): array
    {
        $db = new Db();
        return $db::name('admin_group_access')
            ->where('admin_id', $row['id'])
            ->column('group_id');
    }

    /**
     * 分组名称获取器
     * @param $value
     * @param $row
     * @return array
     */
    public function getGroupNameArrAttr($value, $row): array
    {
        $db          = new Db();
        $groupAccess = $db::name('admin_group_access')
            ->where('admin_id', $row['id'])
            ->column('group_id');
        return (new AdminGroup)->whereIn('id', $groupAccess)->column('name');
    }

    /**
     * 获取管理员头像
     * @param $value // 头像路径
     * @return bool|string
     */
    public function getAvatarAttr($value)
    {
        return full_url($value, true, Config::get('backstage.default_avatar'));
    }

    /**
     * 最后登录时间获取器
     * @param $value
     * @return false|string
     */
    public function getLastLoginTimeAttr($value)
    {
        return $value ? date('Y-m-d H:i:s', $value) : 'none';
    }

    /**
     * 重置用户密码
     * @param int $uid 管理员ID
     * @param string $newPassword 新密码
     */
    public function resetPassword(int $uid, string $newPassword)
    {
        $salt   = Random::build('alnum', 16);
        $passwd = encrypt_password($newPassword, $salt);
        return $this->where(['id' => $uid])->update(['password' => $passwd, 'salt' => $salt]);
    }
}
